/*
 * Esse arquivo é parte do Software de Segurança do LaPEC
 * 
 * Copyright (C) 2012-$AnoCorrente$ Dyego Ítallo Silva Ferreira
 * Copyright (C) 2012-$AnoCorrente$ Eduardo Moreira Barbosa
 * Copyright (C) 2012-$AnoCorrente$ João dos Santos Gonçalves
 * 
 * LaPEC é um Software Livre: Você pode redistribuí-lo e/ou modificá-lo
 * de acordo com os termos da Licença Pública Geral GNU (GNU General Public License)
 * conforme publicada pela Free Software Foundation (FSF). Essa permissão é atribuída
 * na versão 3 da Licença, ou (na sua opinião) qualquer versão.
 * 
 * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este programa,
 * se não, escreva para a Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor,
 * Boston, MA  02110-1301  USA
 * 
 * Se você tiver alguma dúvida e/ou quiser dar suporte ao desenvolvimento, favor entrar em
 * contato nos e-mails <dyegoitallo@gmail.com>, <barbosa.edrd@gmail.com>, <john.jsg@hotmail.com>.
 */
package conexaoBiometria;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

/**
 * Operações com File binário, criação, conversão para o tipo Blob e apagar
 * arquivos binários da pasta temporária.
 *
 * @author João dos Santos Gonçalves
 * @author Dyego Ítallo Silva Ferreira
 */
public final class ArquivoBinario {

    // ===============================================================================
    // Variáveis globais
    // ===============================================================================
    /**
     * Arquivo que será carregado no carregarArquivoBinario
     */
    private File file;

    // ===============================================================================
    // Construtor
    // ===============================================================================    
    public ArquivoBinario () {
        this.file = null;
    }
    
    // ===============================================================================
    // Métodos
    // ===============================================================================
    /**
     * Salva o arquivo capturado pelo leitor no disco em formato binário
     * para ser lançado no banco de dados.
     * 
     * @return um arquivo de entrada binário correspondente a digital
     * capturada pelo leitor biometrico e que será salva no banco.
     */
    public FileInputStream carregarArquivoBinario(String matricula, int digital) {
        
        FileInputStream fileIS = null;

        try {
            file = new File(util.Util.PATHNAME_TEMP + matricula + "-" + digital);
            fileIS = new FileInputStream(file);
        } catch (FileNotFoundException ex) {
            ex.printStackTrace();
        }
        
        return fileIS;
    }
    
    /**
     * Retorna o tamanho inteiro do arquivo lido do disco.
     * 
     * @return o inteiro do tamanho do arquivo lido do disco.
     */
    public int getLengthFile() {
        return (int) file.length();
    }
    
    /**
     * Grava o arquivo binário em disco na pasta temporária das digitais
     * para ser carregadas pelo leitor biometrico do sistema.
     * 
     * @param bin é o arquivo do banco que deve ser salvo em disco.
     */
    public void gravarBinarioEmDisco(String matricula, int digital, InputStream bin) {
        
        int bytesRead = 0;

        byte[] bbuf = new byte[1024];

        OutputStream bout = null;
        
        try {
            // Conferir o efeito da mudança
            bout = new FileOutputStream( util.Util.PATHNAME_TEMP + matricula + "-" + digital);
            
        } catch (FileNotFoundException ex) {
            ex.printStackTrace();
        }
        try {
            while ((bytesRead = bin.read(bbuf)) != -1) {
                bout.write(bbuf, 0, bytesRead);
            }
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

    /**
     * Apaga arquivos binarios da pasta temporária das digitais.
     */
    public static void apagarBinarios() {
        
        String pathName = util.Util.PATHNAME_TEMP.substring(0, util.Util.PATHNAME_TEMP.length() - 1);
        
        File file = new File(pathName);
        String[] nomesArquivos = file.list();
        
        for (String arquivoApagar : nomesArquivos) {
            new File(pathName + File.separator + arquivoApagar).delete();
        }
    }
    
    /**
     * Cria pasta temporária (temp) caso não exista.
     */
    public static void criaTemp () {
        File file = new File(util.Util.PATHNAME_TEMP);
        file.mkdir();
    }
    
}
